/*
 *  Лицензия MIT
 * 
 *  Copyright 2011 Salnikov Aleksey.
 * 
 *  Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного обеспечения
 *  и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
 *  использовать Программное Обеспечение без ограничений, включая неограниченное право
 *  на использование, копирование, изменение, объединение, публикацию, распространение,
 *  сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам,
 *  которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
 * 
 *  Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые
 *  части данного Программного Обеспечения.
 * 
 *  ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
 *  ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
 *  СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ
 *  НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ
 *  ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ
 *  С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
 *  ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */

package CommonTools;

import Interfaces.AdminInterface;
import java.awt.Color;
import java.awt.Component;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

/**
 * Класс содержит различные часто использующиеся функции
 *
 * @author Salnikov Aleksey
 */
public class Actions {

    protected static Remote connect()
    {
        String rmi = "rmi://" + Settings.getParametrValue("serverip") + ":" + Settings.getParametrValue("serverport") + "/AdminServer";
        try {
            return Naming.lookup(rmi);
        } catch (NotBoundException ex) {
            return null;
        } catch (MalformedURLException ex) {
            return null;
        } catch (RemoteException ex) {
            return null;
        }
    }

    public static void refreshDemandsTable(JTable table) throws RemoteException
    {
        //Соединяемся с rmi
        AdminInterface ai = (AdminInterface) connect();
        try {
            TableModel tm = new DemandsTModel(ai.getAllDemands());
            table.clearSelection();
            table.setModel(tm);

            coloredTable(table);
        } catch (SQLException ex) {
            //Logger.getLogger(Actions.class.getName()).log(Level.SEVERE, null, ex);
        }                
    }

    public static ArrayList<Admin> getAllAdmins() throws RemoteException
    {
        AdminInterface ai = (AdminInterface) connect();
        return ai.getAllAdmins();
    }

    /**
     * Процедура удаления заявки
     * @param table таблица с заявками
     */
    public static void deleteDemand(JTable table)
    {
        AdminInterface ai = (AdminInterface) connect();
        DemandsTModel model = (DemandsTModel) table.getModel();

        Demand d = model.getDemandAt(table.getSelectedRow());
        try {
            ai.deleteDemand(d.getId());
            table.clearSelection();
            refreshDemandsTable(table);
        } catch (RemoteException ex) {
            DesignTools.showMessage("Сообщение не удалено", "Возможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
        }
    }

    public static int getStatistic()
    {
        AdminInterface ai = (AdminInterface) connect();
        try {
            return ai.getStatistic();
        } catch (RemoteException ex) {
            DesignTools.showMessage("Ошибка", "Произошла ошибка обновления списка заявок с сервера.\nВозможно, сервер отключен, или неверные" +
                    "настройки сети.\nАвтоматическое обновление заявок можно отключить в настройках", false);
            return -1;
        }
    }

    /**
     * Процедура для обновления списка администраторов
     * @param list JList - список администраторов
     */
    public static void refreshAdminList(JList list)
    {
        AdminInterface ai = (AdminInterface) connect();
        try
        {
            AdminListModel alm = new AdminListModel(ai.getAllAdmins());
            list.clearSelection();
            list.setModel(alm);
        } catch (RemoteException ex) {
            DesignTools.showMessage("Ошибка", "Невозможно получить список администраторов.\nВозможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
        }
    }

    public static void addAdmin(String name, String fam, String otch, String login, String password, int root, String mail, String phone)
    {
        AdminInterface ai = (AdminInterface) connect();
        try
        {
            ai.addAdmin(name, fam, otch, login, password, root, mail, phone);
        }
        catch (Exception e){
            DesignTools.showMessage("Ошибка", "Администратор не добавлен.\nВозможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
        }
    }

    /**
     * Процедура удаления администратора
     * @param admins JList
     */
    public static void deleteAdmin(JList admins)
    {
        AdminInterface ai = (AdminInterface) connect();
        try
        {
            AdminListModel alm = (AdminListModel) admins.getModel();
            Admin admin = alm.getAdmin(admins.getSelectedIndex());
            //admins.clearSelection();
            ai.deleteAdmin(admin.getId());
        }
        catch (Exception e)
        {
            DesignTools.showMessage("Ошибка", "Администратор не удален.\nВозможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
        }
    }

    public static void editAdmin(int id, String name, String fam, String otch, String login, String password, int root, String mail, String phone)
    {
        AdminInterface ai = (AdminInterface) connect();

        try
        {
            ai.editAdmin(id, name, fam, otch, login, password, root, mail, phone);
        }
        catch (Exception e) {
            DesignTools.showMessage("Ошибка", "Информация об администраторе не изменена.\nВозможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
        }
    }

    /**
     * Процедура обновления списка администраторов
     * @param cb JComboBox список администраторов
     */
    public static void refreshAdminComboBox(JComboBox cb)
    {
        try {
            //Сохраняем администратора для последующей вставки
            //AdminComboBoxModel oldModel = (AdminComboBoxModel) cb.getModel();
            //Admin admin = oldModel.getAdmin(cb.getSelectedIndex());

            AdminComboBoxModel acbm = new AdminComboBoxModel(getAllAdmins());
            cb.setModel(acbm);

            //cb.setSelectedIndex(acbm.getAdminPosition(admin));
        } catch (RemoteException ex) {
            DesignTools.showMessage("Ошибка", "Невозможно получить список администраторов.\nВозможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
        }
    }

    public static void refreshAdminComboBox(JComboBox cb, boolean first)
    {
        try {
            //Сохраняем администратора для последующей вставки
            Admin admin = null;
            if (!first)
            {
                AdminComboBoxModel oldModel = (AdminComboBoxModel) cb.getModel();
                try
                {
                    admin = oldModel.getAdmin(cb.getSelectedIndex());
                }
                catch (ArrayIndexOutOfBoundsException ex)
                {
                    admin = new Admin(-2, "назначен", "Не", "", "", "",0, "", "");
                }
            }

            AdminComboBoxModel acbm = new AdminComboBoxModel(getAllAdmins());
            cb.setModel(acbm);

            if (!first) cb.setSelectedIndex(acbm.getAdminPosition(admin));
        }
        catch (RemoteException ex) {
            DesignTools.showMessage("Ошибка", "Невозможно получить список администраторов.\nВозможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
        }
    }

    /**
     * Процедура редактирования заявки. Добавляет комментарий и исполнителя к заявке
     * @param idDemand int уникальный номер заявки
     * @param idAdmin int уникальный номер администратора
     * @param comment String строка комментария
     */
    public static void editDemand(int idDemand, int idAdmin, String comment, String status)
    {
        try
        {
            AdminInterface ai = (AdminInterface) connect();
            ai.editDemand(idDemand, idAdmin, comment, status);
        }
        catch (Exception e)
        {
            DesignTools.showMessage("Ошибка", "Редакция заявки не сохранена.\nВозможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
        }
    }

    /**
     * Процедура отметки заявки о выполениия
     * @param idDemand int уникальный номер заявки
     * @param idAdmin int уникальный номер администратора, выполнившего заявку
     */
    public static void executeDemand(int idDemand, int idAdmin)
    {
        try
        {
            AdminInterface ai = (AdminInterface) connect();
            ai.executeDemand(idDemand, idAdmin);
        }
        catch (Exception e)
        {
            DesignTools.showMessage("Ошибка", "Заявка не помечена как выполненная.\nВозможно, отключен сервер, или неверные настройки\n"
                        + "ip адреса сервера и порта. Пожалуйста, проверьте их.", false);
        }
    }

    public static void filterDemands(int status, int time, int admin, String pc, JTable table)
    {
        AdminInterface ai = (AdminInterface) connect();

        Demand dem = null;
        DemandsTModel tm = null;
        try {
            //Сохраняем заявку для последующего ее поиска
            DemandsTModel oldModel = (DemandsTModel) table.getModel();
            dem = oldModel.getDemandAt(table.getSelectedRow());
            tm = new DemandsTModel(ai.getDemandsByFilter(status, time, admin, pc));
            table.clearSelection();
            table.setModel(tm);
            coloredTable(table);
            int idDemand = tm.getIndexDemand(dem);
            if (idDemand != -1)
                table.setRowSelectionInterval(idDemand, idDemand);
        } catch (Exception e) {}
       
    }

    private static void coloredTable(JTable table)
    {
        DemandsCellRenderer dcr = new DemandsCellRenderer();
        DemandsTModel dtm = (DemandsTModel) table.getModel();

        dcr.setDemands(dtm.getDemands());

        final List<Demand> demands = dtm.getDemands();

        for (int i = 0; i < table.getColumnModel().getColumnCount(); i++)
        {
            table.getColumnModel().getColumn(i).setCellRenderer(dcr);
        }

        //Изменяем размер таблицы
        resizeTableColumn(table);
    }

    /**
     * Процедура изменения размера колонок таблицы. Менять размер не всех колонок нужно
     * @param table JTable - чьи колонки меняем
     */
    private static void resizeTableColumn(JTable table)
    {
        //table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        //table.setAutoCreateRowSorter(true);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
	//JTableHeader th = table.getTableHeader();
	for (int i = 0; i < table.getColumnCount(); i++)
        {
            TableColumn column = table.getColumnModel().getColumn(i);

            //int prefWidth = Math.round(
            //            (float) th.getFontMetrics(th.getFont()).getStringBounds(th.getTable().getColumnName(i),
            //	th.getGraphics()).getWidth());

            if (i < 3)
                column.setPreferredWidth(50);
            //column.setPreferredWidth(column.getMaxWidth());
        }
    }

    /**
     * Функция занимается проверкой, существует ли
     * указанный администратор (а точнее его логин) в БД.
     * Полезно при создании нового администратора
     * @param login String
     * @return
     */
    public static boolean isAdminThere(String login)
    {
        AdminInterface ai = (AdminInterface) connect();
        try {
            return ai.isAdminThere(login);
        } catch (RemoteException ex) {
            DesignTools.showMessage("Ошибка", "Не удалось соединиться с сервером для проверки логина администратора", true);
            return false;
        }
    }

    public static void refreshComputers(JComboBox comp)
    {
        AdminInterface ai = (AdminInterface) connect();

        
        try {
            Vector vect = ai.getComputers();
            int count = vect.size();

            String old = "Все компьютеры";
            try
            {
                old =  comp.getSelectedItem().toString();
            }
            catch (Exception e) {}

            int selectedIndex = 0;

            comp.removeAllItems();
            for (int i = 0; i < count; i++)
            {
                //comp.removeItemAt(i);
                comp.addItem(vect.get(i).toString());
                if (vect.get(i).toString().equals(old))
                    selectedIndex = i;
            }

            comp.setSelectedIndex(selectedIndex);
        } catch (RemoteException ex) {
            DesignTools.showMessage("Ошибка", "Не удалось соединиться с сервером для получения списка компьютеров", true);
        }
    }

    public static String getAutoDeletePeriod()
    {
        AdminInterface ai = (AdminInterface) connect();
        try
        {
            return ai.getAutoDeletePeriod();
        } 
        catch (RemoteException ex)
        {
            DesignTools.showMessage("Ошибка", "Не удалось выполнить автоудаление\n" +
                    "Возможно, отключен сервер, или неправильные настройки сети.", true);
            return "";
        }
    }

    public static void setAutoDeletePeriod(String period)
    {
        AdminInterface ai = (AdminInterface) connect();
        try
        {
            ai.setAutoDeletePeriod(period);
        }
        catch (RemoteException ex) 
        {
            DesignTools.showMessage("Ошибка", "Не удалось выполнить автоудаление\n" +
                    "Возможно, отключен сервер, или неправильные настройки сети.", true);
        }
    }

    public static void autoDeleteDemands()
    {
        AdminInterface ai = (AdminInterface) connect();
        try
        {
            ai.autoDelete();
        }
        catch (RemoteException ex)
        {
            DesignTools.showMessage("Ошибка", "Не удалось выполнить автоудаление\n" +
                    "Возможно, отключен сервер, или неправильные настройки сети.", true);
        }
    }

}
